package com.zhu.instructions.math;

// instructions/math/Irem.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：irem
 *
 * 操作数：无
 *
 * 功能：
 *  对栈顶两个 int 值进行求余运算：value1 % value2
 *
 * 栈变化：
 *      ..., value1, value2 → ..., result
 *
 * 异常：
 *  如果 value2 == 0，则抛出：
 *      java.lang.ArithmeticException: / by zero
 *
 * 注意：
 *  - int 求余遵循 Java 语言规范：符号与被除数相同
 *  - 例如：(-5) % 3 = -2
 */
public class IREM extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        int v2 = stack.popInt(); // 除数
        int v1 = stack.popInt(); // 被除数

        if (v2 == 0) {
            throw new ArithmeticException("/ by zero");
        }

        int result = v1 % v2;
        stack.pushInt(result);
    }
}
